/**
 * @file	kscan.h
 * @author	chipsea
 * @brief	
 * @version	0.1
 * @date	2020-11-30
 * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
 * @note
 */

/*******************************************************************************
* @file		kscan.h
* @brief	Contains all functions support for key scan driver
* @version	0.0
* @date		13. Nov. 2017
* @author	Ding
* 

*
*******************************************************************************/
#ifndef __KSCAN__H__
#define __KSCAN__H__

#ifdef __cplusplus
extern "C" {
#endif


#include "types.h"
#include "gpio.h"

#define		MULTI_KEY_NUM           6
#define		MULTI_KEY_READ_ADDR		(&(AP_KSCAN->mkc[0]))//0x400240CCUL
//#define		MULTI_KEY_READ_ADDR		0x4000d0CCUL//0x400240CCUL

          
const static uint8_t KSCAN_ROW_GPIO[11] = 
{
    P0,
    P2,
    P15,
    P25,
    P10,
    P18,
    P23,
    P32,
    P34,
    P27,
    P7, 
};

const static uint8_t KSCAN_COL_GPIO[12] = 
{
    P1,
    P3,
    P14,
    P24,
    P9,
    P20,
    P33,
    P31,
    P26,
    P17,
    P16,
    P11,
};

#define NUM_KEY_ROWS   4
#define NUM_KEY_COLS   4
#define MAX_KEY_NUM    10
#define MAX_KEY_ROWS    (sizeof(KSCAN_ROW_GPIO)/sizeof(uint8_t))
#define MAX_KEY_COLS    (sizeof(KSCAN_COL_GPIO)/sizeof(uint8_t))

#define KSCAN_ALL_ROW_NUM 11
#define KSCAN_ALL_COL_NUM 12
/*************************************************************
*	@brief		enum variable used for setting rows
*
*/
typedef enum
{
    KEY_ROW_P00   =   0,
    KEY_ROW_P02   =   1,
    KEY_ROW_P15   =   2,
    KEY_ROW_P25   =   3,
    KEY_ROW_P10   =   4,
    KEY_ROW_P18   =   5,
    KEY_ROW_P23   =   6,
    KEY_ROW_P32   =   7,
    KEY_ROW_P34   =   8,
    KEY_ROW_P27   =   9,
    KEY_ROW_P07   =   10, 

}KSCAN_ROWS_e;

/*************************************************************
*	@brief		enum variable used for setting cols
*
*/
typedef enum
{
	KEY_COL_P01   =   0,
	KEY_COL_P03   =   1,
	KEY_COL_P14   =   2,
	KEY_COL_P24   =   3,
	KEY_COL_P09   =   4,
    KEY_COL_P20   =   5,
	KEY_COL_P33   =   6,
	KEY_COL_P31   =   7,
	KEY_COL_P26   =   8,
//	KEY_COL_P17   =   9,
//	KEY_COL_P16   =   10,
    KEY_COL_P11   =   11,
	
}KSCAN_COLS_e;

/*************************************************************
*	@brief		enum variable used for setting multiple key press
*
*/
typedef enum{
	
	NOT_IGNORE_MULTI_KEY = 0,
	IGNORE_MULTI_KEY	= 1
	
}KSCAN_MULTI_KEY_STATE_e;

/*************************************************************
*	@brief		enum variable used for setting whether ignore ghost key
*
*/
typedef enum{
	
	NOT_IGNORE_GHOST_KEY = 0,
	IGNORE_GHOST_KEY	= 1
	
}KSCAN_GHOST_KEY_STATE_e;

/*************************************************************
*	@brief		enum variable used for setting key press sense type
*
*/
typedef enum{
	
	SENCE_HIGH = 0,
	SENCE_LOW = 1
	
}KSCAN_POLARITY_e;

/*************************************************************
*	@brief		enum variable used for setting key press sense type
*
*/
typedef enum{
	
	NO_KEY_PRESS = 0x00,
	ONE_KEY_PRESS = 0x01,
	MULTI_KEY_PRESS = 0x02
	
}KSCAN_KEY_PRESS_STATE_e;

typedef enum{
	KEY_RELEASED = 0,
	KEY_PRESSED,
} kscan_Evt_Type_t;

typedef struct {
	uint8_t				row;
	uint8_t				col;
	kscan_Evt_Type_t	type;
} kscan_Key_t;

typedef struct kscan_Evt_t_{
	uint8_t		 	num;
	kscan_Key_t*	keys; 
} kscan_Evt_t;

typedef void (*kscan_Hdl_t)(kscan_Evt_t* pev);

typedef struct {
	KSCAN_GHOST_KEY_STATE_e  ghost_key_state;
	KSCAN_ROWS_e*			 key_rows;
	KSCAN_COLS_e* 			 key_cols;
	kscan_Hdl_t				 evt_handler;
	uint8_t				 	 interval;
} kscan_Cfg_t;



//PUBLIC FUNCTIONS
int  hal_kscan_init(kscan_Cfg_t cfg, uint8 task_id, uint16 event);
void hal_kscan_timeout_handler(void);
void __attribute__((weak)) hal_KSCAN_IRQHandler(void);

#ifdef __cplusplus
}
#endif


#endif
